Apptainer で OpenFold を実行してタンパク質の立体構造予測を試してみた
はじめに
本記事では、Apptainer を使用してタンパク質の立体構造予測できる OpenFold の実行環境の構築方法と注意点を説明します。この分野ではあれば Docker より Apptainer の方が需要ありそうなので試してみました。
Icons made by Freepik from Flaticon
前提知識
OpenFold の基本的な実行方法は以下の記事を参照してください。
検証環境
推論用の GPUインスタンス
OpenFold を実行(推論)するインスタンスは GPU インスタンスを利用します。OpenFold は現在 CUDA 11 と 12 をサポートしています。CUDA 12 の実行環境がセットアップ済みの AMI を利用しました。
以下の環境で検証を実施しました。
- インスタンスタイプ:g6.4xlarge
- NVIDIA L4 Tensor Core GPU を 1 台搭載
- vCPU 16 コア, 64GB メモリ
- AMI:Deep Learning Base OSS Nvidia Driver GPU AMI (Ubuntu 22.04)
- OS:Ubuntu 22.04 LTS
- CUDA Version:12.4
- Apptainer Version: 1.3.6
Apptainer の実行環境構築
最新のインストール手順は公式ドキュメントを参照してください。
Apptainer のインストール
本検証では以下の手順でインストールしました。
sudo apt update
sudo apt install -y wget
cd /tmp
wget https://github.com/apptainer/apptainer/releases/download/v1.3.6/apptainer_1.3.6_amd64.deb
sudo apt install -y ./apptainer_1.3.6_amd64.deb
インストール後、動作確認を行います。
$ apptainer version
1.3.6
$ apptainer run docker://sylabsio/lolcow:latest
INFO: Converting OCI blobs to SIF format
INFO: Starting build...
Copying blob 16ec32c2132b done |
Copying blob 5ca731fc36c2 done |
Copying config fd0daa4d89 done |
Writing manifest to image destination
2024/12/29 22:16:47 info unpack layer: sha256:16ec32c2132b43494832a05f2b02f7a822479f8250c173d0ab27b3de78b2f058
2024/12/29 22:16:47 info unpack layer: sha256:5ca731fc36c28789c5ddc3216563e8bfca2ab3ea10347e07554ebba1c953242e
INFO: Creating SIF file...
______________________________
< Sun Dec 29 22:16:55 UTC 2024 >
------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
注意: パッケージインストールに失敗
以前、ParallelCluster の Ubuntu 22.04 に Apptainer をインストールしたときはパッケージの追加が可能でした。今回は Deep Learning AMI を使用したせいかこの方法ではインストールできませんでした。
OpenFold コンテナイメージの準備
作成済みの OpenFold の Docker イメージが必要です。OpenFold の Docker イメージの作成方法は以下の記事を参考にしてください。
Apptainer は Docker イメージの実行も可能ですが、今回は Apptainer の用のコンテナイメージ(Singularity Image Format Images)に変換します。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
openfold latest a79640906979 5 days ago 25.6GB
Docker イメージから Apptainer 用のイメージへの変換
Docker イメージを Apptainer で実行可能な SIF ファイルに変換します。
apptainer build
のあとは、作成するイメージ名の指定です(拡張子は.sif
が無難です)docker-daemon:
のあとに[リポジトリ名]:[タグ]を指定します
sudo apptainer build openfold.sif docker-daemon://openfold:latest
2024/12/30 01:47:13 info unpack layer: sha256:bd9ddc54bea929a22b334e73e026d4136e5b73f5cc29942896c72e4ece69b13d
2024/12/30 01:47:13 info unpack layer: sha256:b43f70fd2c45daecd1bcc078f594b7db3e2d2c51426c9f05a3ba73c0c763bded
INFO: Creating SIF file...
INFO: Build complete: /mnt/ebs/openfold.sif
13GB のイメージになりました。Docker イメージとは異なり、1 つのファイルとしてコンテナイメージを扱えます。
$ du -h openfold.sif
13G openfold.sif
注意: ディスク容量の確保
変換時には/var
配下に十分なディスク容量が必要です。ディスク容量が不足する場合は以下のようなエラーが発生します。私はルートの EBS の容量を 80GB から 100GB に拡張して対応しました。
FATAL: While performing build: conveyor failed to get: while converting reference:
loading image from docker engine: Error response from daemon: write
/var/lib/docker/tmp/docker-export-655311700/blobs/sha256/0dcbb9b968ca4d29228c6a7c1f194fe3226d734b310574bb71ed413165c5e263:
no space left on device
Apptainer で OpenFold コンテナ実行
Docker コンテナで実行するときはdocker run
でしたが、Apptainer 様式に置き換えます。
実行コマンド
以下のコマンドで OpenFold を実行します。パスは適時環境に合わせて変更してください。
IMAGE_PATH
: Apptaienr 用のイメージファイルのパスを指定してくださいDATABASE_PATH
: 必要なデータベースファイルのパスを指定してください- カレントリディレクトリの指定は、Apptainer だと自動マウントされるため不要だったかもしれないです
# 環境変数の設定
IMAGE_PATH="/mnt/s3/images"
DATABASE_PATH="/mnt/ebs/openfold/data"
CURRENT_DIR=$PWD
cd /home/ubuntu/openfold/examples/monomer
mkdir results
# Apptainer 実行コマンド
nohup apptainer exec --nv \
--bind ${CURRENT_DIR}:/local,${DATABASE_PATH}:/database \
${IMAGE_PATH}/openfold.sif \
python3 /opt/openfold/run_pretrained_openfold.py \
/local/fasta_dir \
/database/pdb_mmcif/mmcif_files/ \
--uniref90_database_path /database/uniref90/uniref90.fasta \
--mgnify_database_path /database/mgnify/mgy_clusters_2022_05.fa \
--pdb70_database_path /database/pdb70/pdb70 \
--uniclust30_database_path /database/uniclust30/uniclust30_2018_08/uniclust30_2018_08 \
--bfd_database_path /database/bfd/bfd_metaclust_clu_complete_id30_c90_final_seq.sorted_opt \
--jackhmmer_binary_path /opt/conda/bin/jackhmmer \
--hhblits_binary_path /opt/conda/bin/hhblits \
--hhsearch_binary_path /opt/conda/bin/hhsearch \
--kalign_binary_path /opt/conda/bin/kalign \
--openfold_checkpoint_path /database/openfold_params/finetuning_ptm_2.pt \
--config_preset "model_1_ptm" \
--model_device "cuda:0" \
--output_dir /local/results &
主な変更点
- 実行コマンド:
docker run
→apptainer exec
- ボリュームマウント:
-v
→--bind
- GPU オプション:
--gpus all
→--nv
実行結果確認
Apptainer でも問題なく実行できました。
- 推論処理: 約 53.6 秒
- リラクゼーション: 約 19.8 秒
[2025-01-03 19:47:18,785] [INFO] [real_accelerator.py:161:get_accelerator] Setting ds_accelerator to cuda (auto detect)
INFO:/opt/openfold/openfold/utils/script_utils.py:Loaded OpenFold parameters at /database/openfold_params/finetuning_ptm_2.pt...
INFO:/opt/openfold/run_pretrained_openfold.py:Generating alignments for 6KWC_1...
INFO:/opt/openfold/openfold/utils/script_utils.py:Running inference for 6KWC_1...
INFO:/opt/openfold/openfold/utils/script_utils.py:Inference time: 53.64408176899997
INFO:/opt/openfold/run_pretrained_openfold.py:Output written to /local/results/predictions/6KWC_1_model_1_ptm_unrelaxed.pdb...
INFO:/opt/openfold/run_pretrained_openfold.py:Running relaxation on /local/results/predictions/6KWC_1_model_1_ptm_unrelaxed.pdb...
WARNING:root:Warning: importing 'simtk.openmm' is deprecated. Import 'openmm' instead.
INFO:/opt/openfold/openfold/utils/script_utils.py:Relaxation time: 19.831181259999994
INFO:/opt/openfold/openfold/utils/script_utils.py:Relaxed output written to /local/results/predictions/6KWC_1_model_1_ptm_relaxed.pdb...
標準出力に吐かれた実行時間のログは、出力結果のディレクトリ内に作成されるtimings.json
ファイルでも確認できます。
$ tree
.
├── alignments
│ └── 6KWC_1
│ ├── bfd_uniclust_hits.a3m
│ ├── hhsearch_output.hhr
│ ├── mgnify_hits.sto
│ └── uniref90_hits.sto
├── predictions
│ ├── 6KWC_1_model_1_ptm_relaxed.pdb
│ ├── 6KWC_1_model_1_ptm_unrelaxed.pdb
│ └── timings.json
└── timings.json
6KWC_1_model_1_ptm_relaxed.pdb
を ChimeraX で開いてみました。問題なく読み込めています。
まとめ
- Apptainer でも OpenFold を問題なく実行できました
- Docker と Apptainer の実行コマンドのオプションの違いに注意が必要です
おわりに
コンテナの実行基盤として Apptainer を採用している環境であれば、Apptainer に寄せてしまった方が管理しやすいかもしれません。